package wodegua.d24_file_io;

import java.io.FileInputStream;
import java.io.InputStream;

public class d10_TryTest {
    public static void main(String[] args) {
        tryCatchFinally();
        tryWithResource();
    }

    /**
     * try-catch-finally
     * finally代码区的特点:无论try中的程序是正常执行了，还是出现了异常，最后都一定会执行finally区，除非VM终止。
     * 千万不要在finally中返回数据
     * 作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)
     */
    private static void tryCatchFinally(){
        InputStream is = null;
        try {
            String inSrc = "D:\\My Documents\\Desktop\\Dingtalk_20240205115523.jpg";
            is = new FileInputStream(inSrc);
            System.out.println(10/0);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            System.out.println("---------finally---------");
            try {
                if (is != null) is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * JDK7开始提供了更简单的资源释放方案:try-with-resource
     * 该资源使用完毕后，会自动调用其close()方法，完成对资源的释放!
     *
     * try(定义资源1;定义资源2;.){
     * 可能出现异常的代码;
     * }catch(异常类名 变量名){
     * 异常的处理代码;
     * }
     */
    private static void tryWithResource(){
        String inSrc = "D:\\My Documents\\Desktop\\Dingtalk_20240205115523.jpg";
        try (
                // 注意:这里只能放置资源对象。(流对象)
//                String inSrc = "D:\\My Documents\\Desktop\\Dingtalk_20240205115523.jpg";
                //什么是资呢?资源都是会实现AutoCloseable接口。资都会有一个close方法，并且资源放到这里后
                // 用完之后，会被自动调用其close方法完成资源的释放操作。
                InputStream is = new FileInputStream(inSrc);
                d11_TryConnectTest conn = new d11_TryConnectTest();
                ){
            System.out.println("复制完成");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
